package jmine.tec.utils.date;

import java.util.concurrent.Callable;

/**
 * Bean generico que calcula metrica de execucao de um Callable. Pode ser usado, por exemplo, para medir tempo de execucao de telas web
 * usando um filtro.
 * 
 * @author Marcio Ribeiro (mmr)
 */
public class ChronoBean {
    private final IntervalAggregator intervalAggregator = new IntervalAggregator();

    /**
     * @return the requests
     */
    public int getRequests() {
        return intervalAggregator.getIntervalsAdded();
    }

    /**
     * @return tempo medio.
     */
    public double getAvgTime() {
        return this.intervalAggregator.getAvgTime();
    }

    /**
     * @return the maxTime
     */
    public long getMaxTime() {
        return this.intervalAggregator.getMaxTime();
    }

    /**
     * @return the minTime
     */
    public long getMinTime() {
        return this.intervalAggregator.getMinTime();
    }

    /**
     * Dispara execucao e armazena tempo.
     * 
     * @param callable tarefa a ser executada. Deve devolve <code>true</code> se teve sucesso e o valor deve ser armazenado,
     * <code>false</code> caso contrario.
     * @throws Exception caso algo de inesperado ocorra.
     */
    public void trigger(final Callable<Boolean> callable) throws Exception {
        final long ini = System.currentTimeMillis();
        boolean success = false;
        try {
            success = callable.call();
        } finally {
            if (success) {
                this.intervalAggregator.addInterval(ini, System.currentTimeMillis());
            }
        }
    }
}
